package jmine.tec.datadigester.positional;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Map;

import bancosys.tec.datadigester.DigesterBean;
import bancosys.tec.datadigester.DigesterDriver;
import bancosys.tec.datadigester.DigesterFile;

/**
 * Classe abstrata de driver para arquivos posicionais
 * 
 * @author israel.crisanto
 * @param <T> o tipo de DigesterBean.
 */
public abstract class AbstractPositionalDriver<T extends DigesterBean> implements DigesterDriver<T> {

    public static final String ISO_8859_1 = "ISO-8859-1";

    private PositionalFileFiller positionalFiller = new PositionalFileFiller();

    /**
     * Popula a entidade mapeada com o conteúdo da linha informada
     * 
     * @param target target
     * @param line line
     * @throws Exception Exception
     */
    public void populateEntityFromLine(Object target, String line) throws Exception {
        this.positionalFiller.parse(target, line);
    }

    /**
     * Processa o arquivo em questão
     * 
     * @param file file
     * @param driverProperties driverProperties
     * @return bean com o conteúdo lido do arquivo
     */
    public T parse(DigesterFile file, Map<String, String> driverProperties) {
        try {
            return this.getBean(this.getReader(file.getInputStream()));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Retorna o leitor utilizado na criação dos beans
     * 
     * @param inputStream inputStream
     * @return (@link BufferedReader}
     * @throws UnsupportedEncodingException UnsupportedEncodingException
     */
    protected BufferedReader getReader(InputStream inputStream) throws UnsupportedEncodingException {
        return new BufferedReader(new InputStreamReader(inputStream, this.getFileCharset()));
    }

    /**
     * Define o charset a ser utilizado para parse do arquivo
     * 
     * @return encoding utilizado pelo driver
     */
    protected abstract String getFileCharset();

    /**
     * Criação do bean com o conteúdo do arquivo processado
     * 
     * @param reader reader
     * @return T com todas as informações necessárias do arquivo
     * @throws Exception Exception
     */
    protected abstract T getBean(BufferedReader reader) throws Exception;
}
